package cn.com.easy.autocomplete.utils;

import org.apache.commons.lang3.StringUtils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 汉字转拼音工具类
 * 
 * @author nibili 2015年6月19日
 * 
 */
public class PinyinUtils {

	/** 默认的拼音之间的分隔符 */
	private static final String DEFAULT_PINYIN_SEPRATOR = " ";
	/** 拼音的输出格式定义 */
	private static HanyuPinyinOutputFormat format;;

	static {
		format = new HanyuPinyinOutputFormat();
		// 定义大小写输出格式，这里选择小写
		format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		// 定义读音声调输出格式，这里选择无声调
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		// 定义拼音ü的输出格式，这里是一v替代，符合键盘输入习惯
		format.setVCharType(HanyuPinyinVCharType.WITH_V);
	}

	/**
	 * 获取字符串的拼音
	 * 
	 * @param inputString
	 *            输入字符串
	 * @return 字符串的拼音表示
	 */
	public static String getPinYin(String inputString) {
		return getPinYin(inputString, null);
	}

	/**
	 * 字符串的拼音表示
	 * 
	 * @param inputString
	 *            输入字符串
	 * @param separator
	 *            拼音之间的分隔符
	 * @return 字符串的拼音表示
	 */
	public static String getPinYin(String inputString, String separator) {
		if (StringUtils.isEmpty(inputString)) {
			return null;
		}
		inputString = inputString.replaceAll(" ", "");
		char[] input = inputString.trim().toCharArray();
		StringBuilder output = new StringBuilder("");

		try {
			if (separator == null) {
				separator = DEFAULT_PINYIN_SEPRATOR;
			}
			for (int i = 0; i < input.length; i++) {
				// 是否是字母
				if (Character.toString(input[i]).matches("[\u4E00-\u9FA5]+")) {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format);
					output.append(temp[0]);
					output.append(separator);
				} else {
					output.append(Character.toString(input[i]));
				}
			}
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			e.printStackTrace();
		}
		return output.toString();
	}

	/**
	 * 获取首字母缩写拼成的字符串
	 * 
	 * @param pinyin
	 *            拼音字符串
	 * @param separator
	 *            拼音之间的分隔符
	 * @return 首字母缩写
	 */
	public static String getInitialsFromPinyin(String pinyin, String separator) {
		if (StringUtils.isEmpty(pinyin)) {
			return null;
		}
		StringBuilder output = new StringBuilder("");
		if (separator == null) {
			separator = DEFAULT_PINYIN_SEPRATOR;
		}
		String[] pinyins = pinyin.split(separator);
		for (int i = 0; i < pinyins.length; i++) {
			if (pinyins[i].length() > 0) {
				output.append(pinyins[i].charAt(0));
			}
		}
		return output.toString();
	}

	/**
	 * 获取首字母缩写
	 * 
	 * @param pinyin
	 *            拼音字符串
	 * @return 首字母缩写
	 */
	public static String getInitialsFromPinyin(String pinyin) {
		return getInitialsFromPinyin(pinyin, null);
	}

	/**
	 * 获取字符串首字母缩写
	 * 
	 * @param inputString
	 *            输入字符串
	 * @return 首字母缩写
	 */
	public static String getInitials(String inputString) {
		String pinyin = getPinYin(inputString);
		return getInitialsFromPinyin(pinyin);
	}

}
